﻿using System;
using System.Reflection;
using System.IO;
using System.Collections.Generic;
using System.Data;
using System.Text;
using WsProtocol.IEC62056;
using WsProtocol.PublicClass;
using Comm.PublicClass;
using System.Runtime.Serialization;
using Wasion.HHU.Data.Repositories;
using Wasion.HHU.Data.Models;

namespace WsProtocol.IEC62056MDL
{
    //属性定义
    [DataContract]
    public class ProICAttrMth : ProNodeBase
    {
        private static IcAttrMthDbRepository iamSrv = new IcAttrMthDbRepository();
        private static string ptltable = "T_IcAttrMth";
        private string classID = string.Empty; //类ID
        public static List<ProICAttrMth> Attrlst = new List<ProICAttrMth>();  //属性列表
        private static DataTable dtAll = null;  //所有数据     

        protected int attrmth = 1;
        protected string parform = string.Empty;
        protected string ifparent = "0";   //1为父节点  0不是父节点
        protected string seq = string.Empty;  //索引
        protected string ifInteroir = "0";  //是否是厂内参数
        protected string ifReadPars = "0";        
        protected string isvisible = "1";
        protected string datalen = "0";  //数据长度
        
        public string accessMode = string.Empty;
       
        public AttrType AttrMth
        {
            get
            {
                try
                {
                    return (AttrType)attrmth;
                }
                catch
                {
                    return AttrType.属性;
                }
            }
            set { attrmth = (int)value; }
        }
        public int Seq //索引
        {
            get
            {
                try
                {
                    return Convert.ToInt32(seq);
                }
                catch
                {
                    return 0;
                }
            }
            set { seq = value.ToString(); }
        }
        public string DataType { get; set; }
        public string DataLen 
        {
            get 
            {
                if (string.IsNullOrEmpty(datalen))
                    return "0";
                else
                    return datalen; 
            }
            set
            {
                if (string.IsNullOrEmpty(value))
                    datalen = "0";
                else
                    datalen = value;
            }
        }

        public string Units { get; set; }
        public string Scaler { get; set; }
        public string RwFlag
        {
            get { return PubFunc62056.WordToAccessStr(accessMode, attrmth); }
            set { accessMode = PubFunc62056.AccessStrToWord(value, attrmth); }
        }  
        public string ShowFormat { get; set; }  //显示格式
        public string Display { get; set; }  //分解描述
        public TFormType ParForm
        {
            get
            {
                try
                {
                    if (!string.IsNullOrEmpty(parform))  //有参数窗口
                        return (TFormType)Convert.ToInt16(parform);   //参数窗口
                    else
                        return TFormType.无;
                }
                catch
                {
                    return TFormType.无;
                }
            }
            set { parform = ((int)value).ToString(); }

        }  //参数窗口
        public bool IsVisible
        {
            get { return isvisible == "1"; }
            set { isvisible = value ? "1" : "0"; }
        }  //是否在界面显示
        public bool IfParent
        {
            get { return ifparent == "1"; }
            set { ifparent = value ? "1" : "0"; }
        }        
        public ProIClass proClass;  //所属类
        new public List<ProICAttrMth> EleLst { get; set; } //属性包含的元素列表
        public ProICAttrMth ParentAttr { get; set; }  //父属性      
        public string SendFunc { get; set; }  //发送特殊处理函数名
        public string RecFunc { get; set; }  //输入值改变后特殊处理函数名
        public string AnaFunc { get; set; }  //解析后的特殊处理函数名
        public string DataTypeDIY { get; set; }  //数据自定义类型
        public bool IfInteroir
        {
            get { return ifInteroir == "1"; }
            set { ifInteroir = value ? "1" : "0"; }
        }    //是否是厂内参数
        public bool IfReadPars
        {
            get { return ifReadPars == "1"; }
            set { ifReadPars = value ? "1" : "0"; }
        }   //读数据是否带参数
        public string Descs { get; set; }

        public string ModifiedBy { get; set; }
        public string DateModified { get; set; }       

        public object TreeNode;  //对应的树节点    

        public ProICAttrMth()
        {

            // ClassID = string.Empty;
            EleLst = new List<ProICAttrMth>();
            proClass = new ProIClass();
            ParentAttr = null;
            checkState = CheckState.Unchecked;
            DataType = enumData.Data.ToString();
            Scaler = "0";
        }

        protected override void Dispose(bool disposing)
        {
            Attrlst.Remove(this);
            if (ParentAttr != null)
                ParentAttr.EleLst.Remove(this);
        }

        //public static List<ProICAttrMth> TableToList(DataTable dt)
        //{
        //    List<ProICAttrMth> list = new List<ProICAttrMth>();
        //    ProICAttrMth m = null;
        //    foreach (DataRow dr in dt.Rows)
        //    {
        //        m = GetModelByDataRow(dr);
        //        list.Add(m);
        //    }
        //    return list;
        //}

        /// <summary>
        /// 数据行转对象
        /// </summary>
        /// <param name="dr"></param>
        /// <returns></returns>
        //public static ProICAttrMth GetModelByDataRow(DataRow dr)
        //{
        //    ProICAttrMth m = new ProICAttrMth();
        //    m.ID = dr["ID"].ToString();
        //    m.PID = dr["PID"].ToString();
        //    m.classID = dr["ClassID"].ToString();
        //    m.proClass.ID = m.classID;
        //    //m.proClass = ProIClass.GetClassByClassID(m.classID);

        //    m.attrmth = MyConvert.getInt32(dr["AttrMth"]);
        //    m.seq = dr["seq"].ToString();
        //    m.ProName = dr["AmName"].ToString();
        //    m.Units = dr["Units"].ToString();

        //    m.Descs = dr["Descs"].ToString();

        //    m.DataType = dr["DataType"].ToString();
        //    m.DataType = PubFunc62056.TransOldDatatype(m.DataType);

        //    m.DataLen = dr["DataLen"].ToString();
        //    if (string.IsNullOrEmpty(m.DataLen))
        //        m.DataLen = "0";

        //    m.Scaler = dr["Scaler"].ToString();
        //    // m.RwFlag = dr["RwFlag"].ToString();
        //    m.accessMode = dr["RwFlag"].ToString();
        //    m.ShowFormat = dr["ShowFormat"].ToString(); //显示格式              
        //    m.Display = dr["Display"].ToString();   //分解描述   
        //    m.parform = dr["ParForm"].ToString();  //参数窗口
        //    m.DataTypeDIY = dr["DataTypeDIY"].ToString();
        //    m.DataType = PubFunc62056.TransOldDatatype(m.DataType);

        //    if (string.IsNullOrEmpty(m.ShowFormat))
        //    {   //如果没显示格式就给个默认的
        //        m.ShowFormat = PubFunc62056.GetFormatByFormType(m.DataType);

        //        if (string.IsNullOrEmpty(m.ShowFormat))  //如果还没显示格式就按自定义格式给个默认的
        //            m.ShowFormat = PubFunc62056.GetFormatByFormType(m.DataTypeDIY);
        //    }

        //    m.isvisible = dr["IsVisible"].ToString();
        //    m.ifparent = dr["IfParent"].ToString();
        //    m.SendFunc = dr["SendFunc"].ToString();
        //    m.RecFunc = dr["RecFunc"].ToString();
        //    m.AnaFunc = dr["AnaFunc"].ToString();

        //    m.ifInteroir = dr["IfInteroir"].ToString();
        //    m.ifReadPars = dr["IfReadPars"].ToString();

        //    m.ModifiedBy = dr["ModifiedBy"].ToString();
        //    m.DateModified = dr["DateModified"].ToString();
        //    return m;
        //}


        //获取数据库中所有属性
        public static List<ProICAttrMth> GetAllAttr()
        {
            //PtlConsts.easyDb.Clear();
            //PtlConsts.easyDb.TableName = ptltable;
            //PtlConsts.easyDb.SetOrder("ClassID,pid,AttrMth,seq");
            //dtAll = PtlConsts.easyDb.Select();
            //Attrlst = ProICAttrMth.TableToList(dtAll);

            
            var iamList = iamSrv.GetAllList().Result;
            Attrlst = ToProICAttrMthList(iamList);

            return Attrlst;
        }

        public static List<ProICAttrMth> ToProICAttrMthList(List<IcAttrMth> icAttrMths)
        {
            List<ProICAttrMth> list = new List<ProICAttrMth>();
            ProICAttrMth pim = null;
            foreach (IcAttrMth iam in icAttrMths)
            {
                pim = new ProICAttrMth();
                pim.ID = iam.ID;
                pim.PID = iam.PID;
                pim.classID = iam.ClassID;
                pim.proClass.ID = pim.classID;
                //m.proClass = ProIClass.GetClassByClassID(m.classID);

                pim.attrmth = MyConvert.getInt32(iam.AttrMth);
                pim.seq = iam.seq.ToString();
                pim.ProName = iam.AmName;
                pim.Units = iam.Units;

                pim.Descs = iam.Descs;

                pim.DataType = iam.DataType;
                pim.DataType = PubFunc62056.TransOldDatatype(pim.DataType);

                pim.DataLen = iam.DataLen.ToString();
                if (string.IsNullOrEmpty(pim.DataLen))
                {
                    pim.DataLen = "0";
                }
                pim.Scaler = iam.Scaler.ToString();
                // m.RwFlag = iam.RwFlag;
                pim.accessMode = iam.RwFlag;
                pim.ShowFormat = iam.ShowFormat; //显示格式              
                pim.Display = iam.Display;   //分解描述   
                pim.parform = iam.ParForm;  //参数窗口
                pim.DataTypeDIY = iam.DataTypeDIY;
                pim.DataType = PubFunc62056.TransOldDatatype(pim.DataType);

                if (string.IsNullOrEmpty(pim.ShowFormat))
                {   //如果没显示格式就给个默认的
                    pim.ShowFormat = PubFunc62056.GetFormatByFormType(pim.DataType);

                    if (string.IsNullOrEmpty(pim.ShowFormat))  //如果还没显示格式就按自定义格式给个默认的
                    {
                        pim.ShowFormat = PubFunc62056.GetFormatByFormType(pim.DataTypeDIY);
                    }
                }

                pim.isvisible = iam.IsVisible.ToString();
                pim.ifparent = iam.IfParent.ToString();
                pim.SendFunc = iam.SendFunc;
                pim.RecFunc = iam.RecFunc;
                pim.AnaFunc = iam.AnaFunc;

                pim.ifInteroir = iam.IfInteroir.ToString();
                pim.ifReadPars = iam.IfReadPars.ToString();

                pim.ModifiedBy = iam.ModifiedBy;
                pim.DateModified = iam.DateModified;

                list.Add(pim);
            }
            return list;
        }

        /// <summary>
        /// 获取所有数据的集合
        /// </summary>
        /// <returns></returns>
        //public static DataTable GetAttrDataTable()
        //{
        //    //if (dtAll == null)
        //    GetAllAttr();
        //    return dtAll;
        //}

        //根据ID查找属性
        //public static ProICAttrMth GetAttrByID(string id)
        //{
        //    if (dtAll == null)
        //        GetAllAttr();

        //    ProICAttrMth findObAttr = null;

        //    for (int i = 0; i < Attrlst.Count; i++)
        //    {
        //        Application.DoEvents();
        //        if (Attrlst[i].ID == id)
        //        {
        //            findObAttr = Attrlst[i];
        //            GetEleByAttr(findObAttr);
        //            break;
        //        }
        //    }

        //    return findObAttr;
        //}


        //获取某个类包含的属性
        public static List<ProICAttrMth> GetAttrByICID(ProIClass proclass)
        {

            List<ProICAttrMth> list = new List<ProICAttrMth>();
            if (proclass == null)
                return list;

            if (dtAll == null)
                GetAllAttr();

            bool havefind = false;
            for (int i = 0; i < Attrlst.Count; i++)
            {
                if (Attrlst[i].PID != "0")
                    continue;
                if (havefind && Attrlst[i].proClass.ID != proclass.ID)//hxh 有复制粘贴或新加的会加的链表后面，通出界面重新进来会搜不到
                    break;
                if (Attrlst[i].proClass.ID == proclass.ID)
                {
                    havefind = true;
                    Attrlst[i].proClass = proclass;
                    GetEleByAttr(Attrlst[i]); //获取属性表中的元素                  

                    list.Add(Attrlst[i]);
                }
            }
            return list;
        }


        //获取某个属性包含的元素
        public static void GetEleByAttr(ProICAttrMth inAttr)
        {
            if (inAttr.EleLst == null)
                inAttr.EleLst = new List<ProICAttrMth>();
            else
                inAttr.EleLst.Clear();
            bool havefind = false;
            for (int i = 0; i < Attrlst.Count; i++)
            {
                if (havefind && Attrlst[i].PID != inAttr.ID)//hxh 有复制粘贴或新加的会加的链表后面，通出界面重新进来会搜不到
                    break;

                if (Attrlst[i].PID == inAttr.ID)
                {
                    havefind = true;
                    Attrlst[i].ParentAttr = inAttr;

                    GetEleByAttr(Attrlst[i]);

                    inAttr.EleLst.Add(Attrlst[i]);

                }
            }
        }


        /// <summary>
        /// 将界面输入值转为十六进制数 
        /// </summary>
        /// <param name="datanode"></param>
        /// <returns></returns>
        public string DisplayToFrame(string avalue)
        {
            if (string.IsNullOrEmpty(avalue))
                return "";
            string framevalue = avalue;

            if (!string.IsNullOrEmpty(Display))
                framevalue = PtlCommunal.Createdata2(framevalue, Display);
            if (!string.IsNullOrEmpty(ShowFormat))
            {
                framevalue = PtlCommunal.Createdata1(avalue, PtlCommunal.InitFormat(ShowFormat));
            }
            if (string.IsNullOrEmpty(framevalue))
                return avalue;
            else
                return framevalue;
        }


        /// <summary>
        /// 抄读值转为界面显示值 
        /// </summary>
        /// <param name="datanode"></param>
        /// <returns></returns>
        public string FrameToDisplay(string avalue)
        {
            if (string.IsNullOrEmpty(avalue))
                return "";

            if (!string.IsNullOrEmpty(Display))
                avalue = PtlCommunal.Explaindata2(avalue, Display);

            return avalue;
        }


        /// <summary>
        /// 清空输入值
        /// </summary>
        public void ClearInput()
        {
            this.inputValue = "";
            ClearSonInput(this);
        }

        /// <summary>
        /// 清空子节点输入值
        /// </summary>
        /// <param name="sonattr"></param>
        private void ClearSonInput(ProICAttrMth pattr)
        {
            for (int i = 0; i < pattr.EleLst.Count; i++)
            {
                pattr.EleLst[i].inputValue = "";
                ClearSonInput(pattr.EleLst[i]);
            }
        }


        /// <summary>
        /// 添加子节点
        /// </summary>
        /// <param name="sonattr"></param>
        public void AddSon(ProICAttrMth sonattr)
        {
            if (sonattr == null)
                return;
            EleLst.Add(sonattr);
            sonattr.ParentAttr = this;
            sonattr.seq = (EleLst.Count - 1).ToString();
        }


        /// <summary>
        /// 移除子节点
        /// </summary>
        /// <param name="sonattr"></param>
        public void RemoveSon(ProICAttrMth sonattr)
        {
            if (sonattr == null)
                return;
            sonattr.ParentAttr = null;
            EleLst.Remove(sonattr);
        }

        //复制自身
        public ProICAttrMth Copy()
        {
            return Copy(true);
        }


        /// <summary>
        /// 复制自身
        /// </summary>
        /// <param name="copyid">是否连ID也一起复制</param>
        /// <returns></returns>
        public ProICAttrMth Copy(bool copyid)
        {
            //新建一个
            ProICAttrMth newattr = new ProICAttrMth();

            //复制属性
            PropertyInfo[] fromFields = typeof(ProICAttrMth).GetProperties();
            PubFunction.SetProperties(fromFields, this, newattr);

            if (!copyid)
                newattr.ID = string.Empty;
            //绑定树节点
            newattr.TreeNode = this.TreeNode;

            //复制属性包含的元素列表
            newattr.EleLst = new List<ProICAttrMth>();
            if (this.EleLst != null)
                for (int i = 0; i < this.EleLst.Count; i++)
                {
                    ProICAttrMth sonAttr = this.EleLst[i].Copy(copyid);
                    sonAttr.ParentAttr = newattr;
                    newattr.EleLst.Add(sonAttr);
                }

            return newattr;
        }


        /// <summary>
        /// 保存一个属性或方法
        /// </summary>
        /// <param name="insertFlag">true时是插入增加,false更新</param>
        /// <returns></returns>
        //public int SaveICAttr(bool insertFlag, ref string errinfo)
        //{
        //    PtlConsts.easyDb.Clear();
        //    PtlConsts.easyDb.TableName = ptltable;
        //    PtlConsts.easyDb.SetFieldValue("PID", PID, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("ClassID", proClass.ID, EasyDataType.String);

        //    PtlConsts.easyDb.SetFieldValue("AmName", ProName, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("Units", Units, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("Display", Display, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("Descs", Descs, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("AttrMth", attrmth.ToString(), EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("seq", seq, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("Scaler", Scaler, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("DataType", DataType, EasyDataType.String);
        //    if (string.IsNullOrEmpty(DataLen))
        //        DataLen = "0";
        //    PtlConsts.easyDb.SetFieldValue("DataLen", DataLen, EasyDataType.String);
        //    //PtlConsts.easyDb.SetFieldValue("RwFlag", RwFlag, EasyDataType.String);          
        //    PtlConsts.easyDb.SetFieldValue("RwFlag", accessMode, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("ShowFormat", ShowFormat, EasyDataType.String);

        //    PtlConsts.easyDb.SetFieldValue("ParForm", parform, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("IsVisible", isvisible, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("IfParent", ifparent, EasyDataType.String);

        //    PtlConsts.easyDb.SetFieldValue("SendFunc", SendFunc, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("RecFunc", RecFunc, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("AnaFunc", AnaFunc, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("DataTypeDIY", DataTypeDIY, EasyDataType.String);

        //    PtlConsts.easyDb.SetFieldValue("IfInteroir", ifInteroir, EasyDataType.String);
        //    PtlConsts.easyDb.SetFieldValue("IfReadPars", ifReadPars, EasyDataType.String);

        //    PtlConsts.easyDb.SetFieldValue("ModifiedBy", ModifiedBy, EasyDataType.String);

        //    PtlConsts.easyDb.SetFieldValue("DateModified", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), EasyDataType.String);

        //    int rs = 0;
        //    if (insertFlag)
        //    {
        //        ID = Guid.NewGuid().ToString();
        //        PtlConsts.easyDb.SetFieldValue("ID", ID, EasyDataType.String);
        //        rs = PtlConsts.easyDb.Insert(ref errinfo);
        //        if (rs > 0)
        //        {
        //            Attrlst.Add(this);
        //            if (this.ParentAttr != null)
        //                this.ParentAttr.EleLst.Add(this);
        //            else
        //                if (this.proClass != null)
        //                this.proClass.Attrlst.Add(this);
        //        }
        //    }
        //    else
        //    {
        //        PtlConsts.easyDb.SetWhereParameter(true, "ID", "=", ID, EasyDataType.String);
        //        rs = PtlConsts.easyDb.Update(ref errinfo);
        //    }
        //    return rs;
        //}

        /// <summary>
        /// 删除一个属性或方法
        /// </summary>
        /// <returns></returns>
        //public int DeleteICAttrByID(ref string errinfo)
        //{
        //    if (string.IsNullOrEmpty(ID))
        //        return 1;
        //    try
        //    {
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable;
        //        PtlConsts.easyDb.SetWhereParameter(true, "ID", "=", ID, EasyDataType.String);
        //        int rs = PtlConsts.easyDb.Delete(ref errinfo);
        //        if (rs >= 0)
        //        {
        //            for (int i = EleLst.Count - 1; i >= 0; i--)
        //                EleLst[i].DeleteICAttrByID(ref errinfo);  //删除该属性包含的属性或元素
        //            this.Dispose();
        //        }
        //        return rs;
        //    }
        //    catch (Exception ex)
        //    {
        //        errinfo = ex.Message;
        //        return -1;
        //    }
        //}

        //public static int DeleteICAttrByClassID(string sClassID)
        //{
        //    if (string.IsNullOrEmpty(sClassID)) return 1;
        //    try
        //    {
        //        PtlConsts.easyDb.Clear();
        //        PtlConsts.easyDb.TableName = ptltable;
        //        PtlConsts.easyDb.SetWhereParameter(true, "ClassID", "=", sClassID, EasyDataType.String);
        //        int rs = PtlConsts.easyDb.Delete();
        //        return rs;
        //    }
        //    catch
        //    {
        //        return -1;
        //    }
        //}

    }


}
